#loading all the necessary libraries
library(gutenbergr)
library(tidytext)
library(tidyverse)
library(readtext)
library(sentimentr)
library(ggiraphExtra)
library(ggplot2)
library(RColorBrewer)
library(scales)
library(plotly)
library(htmlwidgets)
#finding texts by Fitzgerald on gutenberg
fitzgerald_text <- gutenberg_works(author == "Fitzgerald, F. Scott (Francis Scott)")
fitzgerald_text <- fitzgerald_text[-c(2,3), ]
#downloading all the texts found
fitzgerald_download <- fitzgerald_text %>% 
                      gutenberg_download(meta_fields = c("title", "author"))
Determining mirror for Project Gutenberg from http://www.gutenberg.org/robot/harvest
Using mirror http://aleph.gutenberg.org
The_Great_Gatsby <- read_delim("The Great Gatsby_Fitzgerald, F. Scott (Francis Scott)_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
Rows: 41 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: "."
chr (1): text

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
The_Great_Gatsby <- The_Great_Gatsby %>% mutate(author = "Fitzgerald, F. Scott (Francis Scott)", .after = text) %>% mutate(title = "The Great Gatsby", .before = author)

Tender_is_the_Night <- read_delim("Tender is the Night_Fitzgerald, F. Scott (Francis Scott)_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
Rows: 3346 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: "."
chr (1): text

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Tender_is_the_Night <- Tender_is_the_Night %>% mutate(author = "Fitzgerald, F. Scott (Francis Scott)", .after = text) %>% mutate(title = "Tender is the Night", .before = author)
fitzgerald_download$gutenberg_id <- NULL
fitzgerald_corpus <- bind_rows(fitzgerald_download, The_Great_Gatsby, Tender_is_the_Night)
Warning: One or more parsing issues, see `problems()` for details
Warning: One or more parsing issues, see `problems()` for details

The_Sun_Also_Rises_Hemingway_Ernest <- read_delim("The Sun Also Rises_Hemingway, Ernest_clean.txt", 
    delim = "\t", quote = "\\\"", escape_double = FALSE, 
    trim_ws = TRUE)
The_Sun_Also_Rises_Hemingway_Ernest <- The_Sun_Also_Rises_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Sun Also Rises", .before = author)

The_Old_Man_and_the_Sea_Hemingway_Ernest <- read_delim("The Old Man and the Sea_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
The_Old_Man_and_the_Sea_Hemingway_Ernest <- The_Old_Man_and_the_Sea_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Old Man and the Sea", .before = author)

For_Whom_the_Bell_Tolls_Hemingway_Ernest <- read_delim("For Whom the Bell Tolls_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
For_Whom_the_Bell_Tolls_Hemingway_Ernest <- For_Whom_the_Bell_Tolls_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "For Whom The Bell Tolls", .before = author)

A_Farewell_to_Arms_Hemingway_Ernest <- read_delim("A Farewell to Arms_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
A_Farewell_to_Arms_Hemingway_Ernest <- A_Farewell_to_Arms_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "A Farewell to Arms", .before = author)

The_Garden_of_Eden_Hemingway <- read_delim("The Garden of Eden_Hemingway_clean.txt", 
    delim = "\t", quote = "\\\"", escape_double = FALSE, 
    trim_ws = TRUE)
The_Garden_of_Eden_Hemingway_Ernest <- The_Garden_of_Eden_Hemingway %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Garden of Eden", .before = author)

hemingway_corpus <- bind_rows(The_Sun_Also_Rises_Hemingway_Ernest,The_Old_Man_and_the_Sea_Hemingway_Ernest,For_Whom_the_Bell_Tolls_Hemingway_Ernest,A_Farewell_to_Arms_Hemingway_Ernest,The_Garden_of_Eden_Hemingway_Ernest)
all_authors <- bind_rows(fitzgerald_corpus, hemingway_corpus)
tidy_all_authors <- all_authors %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
#breaking up texts into words
tidy_hemingway <- hemingway_corpus %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
tidy_all_authors <- all_authors %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
nrc_list <- get_sentiments("nrc")
counter <- tidy_hemingway %>% inner_join(nrc_list) %>% count(word, sort = TRUE)
Joining, by = "word"
sentiment_abs_h <- tidy_hemingway %>% inner_join(get_sentiments("nrc") %>% 
                 filter(sentiment %in% c("anger", 
                                         "anticipation", "disgust", "fear", "joy", "sadness", "surprise", "trust"))
    ) %>%
  count(sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,
              values_fill = 0) %>% mutate(author = "Hemingway")#%>% 
Joining, by = "word"
  #mutate(sentiment = positive - negative)
total_words_hemingway <- NROW(tidy_hemingway)
sentiment_rel_h <- sentiment_abs_h[,-9]/total_words_hemingway
sentiment_rel_h <- sentiment_rel_h*100
sentiment_rel_h <- sentiment_rel_h %>% mutate(author = "Hemingway")
#anger  anticipation    disgust fear    joy sadness surprise    trust
nrc_joy <- get_sentiments("nrc")
#tidy_hemingway %>% inner_join(nrc_list) %>% count(word, sort = TRUE)
sentiment_abs_f <- tidy_fitzgerald %>% inner_join(get_sentiments("nrc") %>% 
                 filter(sentiment %in% c("anger", 
                                         "anticipation", "disgust", "fear", "joy", "sadness", "surprise", "trust"))
    ) %>%
  count(sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,
              values_fill = 0) %>% mutate(author = "Fitzgerald")
Joining, by = "word"
total_words_fitzgerald <- NROW(tidy_fitzgerald)
sentiment_rel_f <- sentiment_abs_f[,-9]/total_words_fitzgerald
sentiment_rel_f <- sentiment_rel_f*100
sentiment_rel_f <- sentiment_rel_f %>% mutate(author = "Fitzgerald")
sentiment_both <- bind_rows(sentiment_rel_h, sentiment_rel_f)

data_vis_2 <- ggRadar(
  data = sentiment_both,
  mapping = aes(color = author),
  rescale = FALSE,
  interactive = TRUE,
  size = 2,
  grid.min = 1,
  centre.y = 0,
  legend.position = "right"
)
data_vis_2
emotion_list <- read_csv("emotion_list.txt")
Rows: 486 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): word

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
emotion_words <- tibble(emotion_list, emotion = TRUE)
hemingway_emotions <- tidy_hemingway %>% left_join(emotion_words)
Joining, by = "word"
fitzgerald_emotions <- tidy_fitzgerald %>% left_join(emotion_words)
Joining, by = "word"
#counting how often female words appeared
#table shows each text and the respective percentage
fitzgerald_emotion_calc <- fitzgerald_emotions %>% group_by(title) %>% count(emotion) %>% mutate(percent = round(n/sum(n)*100, 2)) %>% mutate(author = "F. Scott Fitzgerald")
#counting how often female words appeared
#table shows each text and the respective percentage
hemingway_emotion_calc <- hemingway_emotions %>% group_by(title) %>% count(emotion) %>% mutate(percent = round(n/sum(n)*100, 2)) %>% mutate(author = "Earnest Hemingway")
combined_table <- bind_rows(hemingway_emotion_calc, fitzgerald_emotion_calc) %>% filter(emotion == TRUE)

data_vis_1 <-ggplot(data=combined_table, aes(x=percent, y=title, fill=author, text = paste("% of emotion: ", percent, sep = ""))) +
  geom_bar(stat="identity") + labs(x = "% of emotion detected", 
       y = "All novels", fill = "Author", title = "Emotive content in all novels")
       
data_vis_1_int <- ggplotly(data_vis_1, tooltip = "text")
data_vis_1_int
save(author_table, hemingway_corpus, fitzgerald_corpus, data_vis_1_int, data_vis_2, file = "saved_data.rda")
puretext <- bind_rows(tidy_hemingway[, 3], tidy_fitzgerald[, 3])
purestring <- unlist(puretext)
sad_1 <- paste(unique(str_subset(purestring, "^anger|^angr|^disgust|^contempt|^revuls|^envy|^envi|^jealous|^exaspera|^frustra|^aggrava|^agitat|^annoy|^grouch|^grump|^irrita|^bitter|^dislike|^feroci|^fury|^furi|^hate|^hostil|^loath|^outrage|^rage|^rag|^resent|^scorn|^spite|^venge|^wrath|^torment|^fear|^horr|^alarm|^fright|^hyster|^mortifi|^panic|^shock|^terror|^nervous|^anxi|^apprehen|^distress|^dread|^tense|^uneasi|^uneasy|^worr|^joy|^cheer|^amuse|^bliss|^delight|^ecsta|^elati|^enjoy|^euphor|^gaiety|^glad|^glee|^happi|^jolli|^jolly|^jovial|^jubil|^satisf|^content|^pleasur|^enthrall|^raptur|^eager|^hope|^optimis|^pride|^proud|^triumph|^relie|^zest|^enthusias|^excit|^exhilara|^thrill|^zeal|^love|^ador|^affec|^attrac|^care|^cari|^compassion|^fond|^like|^liking|^sentiment|^tender|^long|^arous|^desire|^infatuat|^lust|^passion|^sad|^disappoint|^dismay|^displeasur|^alien|^defeat|^deject|^embarrass|^homesick|^humiliat|^insecur|^isola|^insult|^lonel|^neglect|^reject|^depress|^despair|^gloom|^glum|^grie|^hopeless|^melancholi|^miser|^sorrow|^unhappi|^woe|^shame|^guilt|^regret|^remorse|^suffer|^agon|^anguish|^hurt|^pity|^piti|^sympath|^surprise|^amaze|^astonish")), collapse = ' ')
LS0tCnRpdGxlOiAiUHJvamVjdCAyIgphdXRob3JzOiAiTmF2ZGVlcCBTaW5naCwgU2hyZXlhIEtob2JyYWdhZGUsIFNhbXJpZGhpIEhvb2RhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KI2xvYWRpbmcgYWxsIHRoZSBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZ3V0ZW5iZXJncikKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHRleHQpCmxpYnJhcnkoc2VudGltZW50cikKbGlicmFyeShnZ2lyYXBoRXh0cmEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShodG1sd2lkZ2V0cykKYGBgCgpgYGB7ciBndXRlbmJlcmdfZml0emdlcmFsZF93b3Jrc30KI2ZpbmRpbmcgdGV4dHMgYnkgRml0emdlcmFsZCBvbiBndXRlbmJlcmcKZml0emdlcmFsZF90ZXh0IDwtIGd1dGVuYmVyZ193b3JrcyhhdXRob3IgPT0gIkZpdHpnZXJhbGQsIEYuIFNjb3R0IChGcmFuY2lzIFNjb3R0KSIpCmZpdHpnZXJhbGRfdGV4dCA8LSBmaXR6Z2VyYWxkX3RleHRbLWMoMiwzKSwgXQpgYGAKCmBgYHtyIGd1dGVuYmVyZ19maXR6Z2VyYWxkX2Rvd25sb2FkfQojZG93bmxvYWRpbmcgYWxsIHRoZSB0ZXh0cyBmb3VuZApmaXR6Z2VyYWxkX2Rvd25sb2FkIDwtIGZpdHpnZXJhbGRfdGV4dCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICBndXRlbmJlcmdfZG93bmxvYWQobWV0YV9maWVsZHMgPSBjKCJ0aXRsZSIsICJhdXRob3IiKSkKYGBgCmBgYHtyIGltcG9ydF9GaXR6Z2VyYWxkX2Jvb2tzfQpUaGVfR3JlYXRfR2F0c2J5IDwtIHJlYWRfZGVsaW0oIlRoZSBHcmVhdCBHYXRzYnlfRml0emdlcmFsZCwgRi4gU2NvdHQgKEZyYW5jaXMgU2NvdHQpX2NsZWFuLnR4dCIsIAogICAgZGVsaW0gPSAiLiIsIHF1b3RlID0gIlxcXCIiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UpClRoZV9HcmVhdF9HYXRzYnkgPC0gVGhlX0dyZWF0X0dhdHNieSAlPiUgbXV0YXRlKGF1dGhvciA9ICJGaXR6Z2VyYWxkLCBGLiBTY290dCAoRnJhbmNpcyBTY290dCkiLCAuYWZ0ZXIgPSB0ZXh0KSAlPiUgbXV0YXRlKHRpdGxlID0gIlRoZSBHcmVhdCBHYXRzYnkiLCAuYmVmb3JlID0gYXV0aG9yKQoKVGVuZGVyX2lzX3RoZV9OaWdodCA8LSByZWFkX2RlbGltKCJUZW5kZXIgaXMgdGhlIE5pZ2h0X0ZpdHpnZXJhbGQsIEYuIFNjb3R0IChGcmFuY2lzIFNjb3R0KV9jbGVhbi50eHQiLCAKICAgIGRlbGltID0gIi4iLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFKQpUZW5kZXJfaXNfdGhlX05pZ2h0IDwtIFRlbmRlcl9pc190aGVfTmlnaHQgJT4lIG11dGF0ZShhdXRob3IgPSAiRml0emdlcmFsZCwgRi4gU2NvdHQgKEZyYW5jaXMgU2NvdHQpIiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJUZW5kZXIgaXMgdGhlIE5pZ2h0IiwgLmJlZm9yZSA9IGF1dGhvcikKYGBgCgpgYGB7ciBjcmVhdGVfRml0emdlcmFsZF9jb3JwdXN9CmZpdHpnZXJhbGRfZG93bmxvYWQkZ3V0ZW5iZXJnX2lkIDwtIE5VTEwKZml0emdlcmFsZF9jb3JwdXMgPC0gYmluZF9yb3dzKGZpdHpnZXJhbGRfZG93bmxvYWQsIFRoZV9HcmVhdF9HYXRzYnksIFRlbmRlcl9pc190aGVfTmlnaHQpCmBgYAoKCmBgYHtyIGltcG9ydF9IZW1pbmd3YXlfYm9va3N9CgpUaGVfU3VuX0Fsc29fUmlzZXNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJUaGUgU3VuIEFsc28gUmlzZXNfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICJcdCIsIHF1b3RlID0gIlxcXCIiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpClRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0IDwtIFRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIFN1biBBbHNvIFJpc2VzIiwgLmJlZm9yZSA9IGF1dGhvcikKClRoZV9PbGRfTWFuX2FuZF90aGVfU2VhX0hlbWluZ3dheV9Fcm5lc3QgPC0gcmVhZF9kZWxpbSgiVGhlIE9sZCBNYW4gYW5kIHRoZSBTZWFfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICIuIiwgcXVvdGUgPSAiXFxcIiIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSkKVGhlX09sZF9NYW5fYW5kX3RoZV9TZWFfSGVtaW5nd2F5X0VybmVzdCA8LSBUaGVfT2xkX01hbl9hbmRfdGhlX1NlYV9IZW1pbmd3YXlfRXJuZXN0ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIE9sZCBNYW4gYW5kIHRoZSBTZWEiLCAuYmVmb3JlID0gYXV0aG9yKQoKRm9yX1dob21fdGhlX0JlbGxfVG9sbHNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJGb3IgV2hvbSB0aGUgQmVsbCBUb2xsc19IZW1pbmd3YXksIEVybmVzdF9jbGVhbi50eHQiLCAKICAgIGRlbGltID0gIi4iLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFKQpGb3JfV2hvbV90aGVfQmVsbF9Ub2xsc19IZW1pbmd3YXlfRXJuZXN0IDwtIEZvcl9XaG9tX3RoZV9CZWxsX1RvbGxzX0hlbWluZ3dheV9Fcm5lc3QgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5LCBFYXJuZXN0IiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJGb3IgV2hvbSBUaGUgQmVsbCBUb2xscyIsIC5iZWZvcmUgPSBhdXRob3IpCgpBX0ZhcmV3ZWxsX3RvX0FybXNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJBIEZhcmV3ZWxsIHRvIEFybXNfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICIuIiwgcXVvdGUgPSAiXFxcIiIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSkKQV9GYXJld2VsbF90b19Bcm1zX0hlbWluZ3dheV9Fcm5lc3QgPC0gQV9GYXJld2VsbF90b19Bcm1zX0hlbWluZ3dheV9Fcm5lc3QgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5LCBFYXJuZXN0IiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJBIEZhcmV3ZWxsIHRvIEFybXMiLCAuYmVmb3JlID0gYXV0aG9yKQoKVGhlX0dhcmRlbl9vZl9FZGVuX0hlbWluZ3dheSA8LSByZWFkX2RlbGltKCJUaGUgR2FyZGVuIG9mIEVkZW5fSGVtaW5nd2F5X2NsZWFuLnR4dCIsIAogICAgZGVsaW0gPSAiXHQiLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCAKICAgIHRyaW1fd3MgPSBUUlVFKQpUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5X0VybmVzdCA8LSBUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIEdhcmRlbiBvZiBFZGVuIiwgLmJlZm9yZSA9IGF1dGhvcikKCmhlbWluZ3dheV9jb3JwdXMgPC0gYmluZF9yb3dzKFRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0LFRoZV9PbGRfTWFuX2FuZF90aGVfU2VhX0hlbWluZ3dheV9Fcm5lc3QsRm9yX1dob21fdGhlX0JlbGxfVG9sbHNfSGVtaW5nd2F5X0VybmVzdCxBX0ZhcmV3ZWxsX3RvX0FybXNfSGVtaW5nd2F5X0VybmVzdCxUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5X0VybmVzdCkKYGBgCgpgYGB7ciBhbGxfYXV0aG9yc30KYWxsX2F1dGhvcnMgPC0gYmluZF9yb3dzKGZpdHpnZXJhbGRfY29ycHVzLCBoZW1pbmd3YXlfY29ycHVzKQoKYGBgCgpgYGB7ciB0aWR5X2FsbF9hdXRob3JzfQp0aWR5X2FsbF9hdXRob3JzIDwtIGFsbF9hdXRob3JzICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JSBhbnRpX2pvaW4oc3RvcF93b3JkcykKYGBgCgoKYGBge3IgdGlkeV9oZW1pbmd3YXl9CiNicmVha2luZyB1cCB0ZXh0cyBpbnRvIHdvcmRzCnRpZHlfaGVtaW5nd2F5IDwtIGhlbWluZ3dheV9jb3JwdXMgJT4lIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkgJT4lIGFudGlfam9pbihzdG9wX3dvcmRzKQpgYGAKCmBgYHtyIHRpZHlfZml0emdlcmFsZH0KI2JyZWFraW5nIHVwIHRleHRzIGludG8gd29yZHMKdGlkeV9maXR6Z2VyYWxkIDwtIGZpdHpnZXJhbGRfY29ycHVzICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JSBhbnRpX2pvaW4oc3RvcF93b3JkcykKYGBgCgpgYGB7ciBzZW50aW1lbnRfbnJjfQpucmNfbGlzdCA8LSBnZXRfc2VudGltZW50cygibnJjIikKY291bnRlciA8LSB0aWR5X2hlbWluZ3dheSAlPiUgaW5uZXJfam9pbihucmNfbGlzdCkgJT4lIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQpzZW50aW1lbnRfYWJzX2ggPC0gdGlkeV9oZW1pbmd3YXkgJT4lIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpICU+JSAKICAgICAgICAgICAgICAgICBmaWx0ZXIoc2VudGltZW50ICVpbiUgYygiYW5nZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW50aWNpcGF0aW9uIiwgImRpc2d1c3QiLCAiZmVhciIsICJqb3kiLCAic2FkbmVzcyIsICJzdXJwcmlzZSIsICJ0cnVzdCIpKQogICAgKSAlPiUKICBjb3VudChzZW50aW1lbnQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzZW50aW1lbnQsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLAogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5IikjJT4lIAogICNtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkKdG90YWxfd29yZHNfaGVtaW5nd2F5IDwtIE5ST1codGlkeV9oZW1pbmd3YXkpCnNlbnRpbWVudF9yZWxfaCA8LSBzZW50aW1lbnRfYWJzX2hbLC05XS90b3RhbF93b3Jkc19oZW1pbmd3YXkKc2VudGltZW50X3JlbF9oIDwtIHNlbnRpbWVudF9yZWxfaCoxMDAKc2VudGltZW50X3JlbF9oIDwtIHNlbnRpbWVudF9yZWxfaCAlPiUgbXV0YXRlKGF1dGhvciA9ICJIZW1pbmd3YXkiKQojYW5nZXIJYW50aWNpcGF0aW9uCWRpc2d1c3QJZmVhcglqb3kJc2FkbmVzcwlzdXJwcmlzZQl0cnVzdApgYGAKCmBgYHtyfQpucmNfam95IDwtIGdldF9zZW50aW1lbnRzKCJucmMiKQojdGlkeV9oZW1pbmd3YXkgJT4lIGlubmVyX2pvaW4obnJjX2xpc3QpICU+JSBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkKc2VudGltZW50X2Fic19mIDwtIHRpZHlfZml0emdlcmFsZCAlPiUgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygibnJjIikgJT4lIAogICAgICAgICAgICAgICAgIGZpbHRlcihzZW50aW1lbnQgJWluJSBjKCJhbmdlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnRpY2lwYXRpb24iLCAiZGlzZ3VzdCIsICJmZWFyIiwgImpveSIsICJzYWRuZXNzIiwgInN1cnByaXNlIiwgInRydXN0IikpCiAgICApICU+JQogIGNvdW50KHNlbnRpbWVudCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNlbnRpbWVudCwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IG4sCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgbXV0YXRlKGF1dGhvciA9ICJGaXR6Z2VyYWxkIikKCnRvdGFsX3dvcmRzX2ZpdHpnZXJhbGQgPC0gTlJPVyh0aWR5X2ZpdHpnZXJhbGQpCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfYWJzX2ZbLC05XS90b3RhbF93b3Jkc19maXR6Z2VyYWxkCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfcmVsX2YqMTAwCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfcmVsX2YgJT4lIG11dGF0ZShhdXRob3IgPSAiRml0emdlcmFsZCIpCmBgYAoKYGBge3J9CnNlbnRpbWVudF9ib3RoIDwtIGJpbmRfcm93cyhzZW50aW1lbnRfcmVsX2gsIHNlbnRpbWVudF9yZWxfZikKCmRhdGFfdmlzXzIgPC0gZ2dSYWRhcigKICBkYXRhID0gc2VudGltZW50X2JvdGgsCiAgbWFwcGluZyA9IGFlcyhjb2xvciA9IGF1dGhvciksCiAgcmVzY2FsZSA9IEZBTFNFLAogIGludGVyYWN0aXZlID0gVFJVRSwKICBzaXplID0gMiwKICBncmlkLm1pbiA9IDEsCiAgY2VudHJlLnkgPSAwLAogIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIKKQpkYXRhX3Zpc18yCmBgYAoKYGBge3IgZW1vdGlvbl93b3Jkc30KZW1vdGlvbl9saXN0IDwtIHJlYWRfY3N2KCJlbW90aW9uX2xpc3QudHh0IikKZW1vdGlvbl93b3JkcyA8LSB0aWJibGUoZW1vdGlvbl9saXN0LCBlbW90aW9uID0gVFJVRSkKYGBgCgpgYGB7ciBoZW1pbmd3YXlfZW1vdGlvbnN9CmhlbWluZ3dheV9lbW90aW9ucyA8LSB0aWR5X2hlbWluZ3dheSAlPiUgbGVmdF9qb2luKGVtb3Rpb25fd29yZHMpCmBgYAoKYGBge3IgZml0emdlcmFsZF9lbW90aW9uc30KZml0emdlcmFsZF9lbW90aW9ucyA8LSB0aWR5X2ZpdHpnZXJhbGQgJT4lIGxlZnRfam9pbihlbW90aW9uX3dvcmRzKQpgYGAKCmBgYHtyIGZpdHpnZXJhbGRfZW1vdGlvbl90YWJsZX0KI2NvdW50aW5nIGhvdyBvZnRlbiBmZW1hbGUgd29yZHMgYXBwZWFyZWQKI3RhYmxlIHNob3dzIGVhY2ggdGV4dCBhbmQgdGhlIHJlc3BlY3RpdmUgcGVyY2VudGFnZQpmaXR6Z2VyYWxkX2Vtb3Rpb25fY2FsYyA8LSBmaXR6Z2VyYWxkX2Vtb3Rpb25zICU+JSBncm91cF9ieSh0aXRsZSkgJT4lIGNvdW50KGVtb3Rpb24pICU+JSBtdXRhdGUocGVyY2VudCA9IHJvdW5kKG4vc3VtKG4pKjEwMCwgMikpICU+JSBtdXRhdGUoYXV0aG9yID0gIkYuIFNjb3R0IEZpdHpnZXJhbGQiKQoKYGBgCgpgYGB7ciBoZW1pbmd3YXlfZW1vdGlvbl90YWJsZX0KI2NvdW50aW5nIGhvdyBvZnRlbiBmZW1hbGUgd29yZHMgYXBwZWFyZWQKI3RhYmxlIHNob3dzIGVhY2ggdGV4dCBhbmQgdGhlIHJlc3BlY3RpdmUgcGVyY2VudGFnZQpoZW1pbmd3YXlfZW1vdGlvbl9jYWxjIDwtIGhlbWluZ3dheV9lbW90aW9ucyAlPiUgZ3JvdXBfYnkodGl0bGUpICU+JSBjb3VudChlbW90aW9uKSAlPiUgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuL3N1bShuKSoxMDAsIDIpKSAlPiUgbXV0YXRlKGF1dGhvciA9ICJFYXJuZXN0IEhlbWluZ3dheSIpCgpgYGAKCmBgYHtyIGVtb3Rpb25fcGxvdH0KY29tYmluZWRfdGFibGUgPC0gYmluZF9yb3dzKGhlbWluZ3dheV9lbW90aW9uX2NhbGMsIGZpdHpnZXJhbGRfZW1vdGlvbl9jYWxjKSAlPiUgZmlsdGVyKGVtb3Rpb24gPT0gVFJVRSkKCmRhdGFfdmlzXzEgPC1nZ3Bsb3QoZGF0YT1jb21iaW5lZF90YWJsZSwgYWVzKHg9cGVyY2VudCwgeT10aXRsZSwgZmlsbD1hdXRob3IsIHRleHQgPSBwYXN0ZSgiJSBvZiBlbW90aW9uOiAiLCBwZXJjZW50LCBzZXAgPSAiIikpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIGxhYnMoeCA9ICIlIG9mIGVtb3Rpb24gZGV0ZWN0ZWQiLCAKICAgICAgIHkgPSAiQWxsIG5vdmVscyIsIGZpbGwgPSAiQXV0aG9yIiwgdGl0bGUgPSAiRW1vdGl2ZSBjb250ZW50IGluIGFsbCBub3ZlbHMiKQogICAgICAgCmRhdGFfdmlzXzFfaW50IDwtIGdncGxvdGx5KGRhdGFfdmlzXzEsIHRvb2x0aXAgPSAidGV4dCIpCmRhdGFfdmlzXzFfaW50CmBgYAoKYGBge3IgZXhwb3J0aW5nX3RhYmxlc30Kc2F2ZShhdXRob3JfdGFibGUsIGhlbWluZ3dheV9jb3JwdXMsIGZpdHpnZXJhbGRfY29ycHVzLCBkYXRhX3Zpc18xX2ludCwgZGF0YV92aXNfMiwgZmlsZSA9ICJzYXZlZF9kYXRhLnJkYSIpCmBgYAoKCgpgYGB7ciB3aWxkY2FyZH0KcHVyZXRleHQgPC0gYmluZF9yb3dzKHRpZHlfaGVtaW5nd2F5WywgM10sIHRpZHlfZml0emdlcmFsZFssIDNdKQpwdXJlc3RyaW5nIDwtIHVubGlzdChwdXJldGV4dCkKc2FkXzEgPC0gcGFzdGUodW5pcXVlKHN0cl9zdWJzZXQocHVyZXN0cmluZywgIl5hbmdlcnxeYW5ncnxeZGlzZ3VzdHxeY29udGVtcHR8XnJldnVsc3xeZW52eXxeZW52aXxeamVhbG91c3xeZXhhc3BlcmF8XmZydXN0cmF8XmFnZ3JhdmF8XmFnaXRhdHxeYW5ub3l8Xmdyb3VjaHxeZ3J1bXB8Xmlycml0YXxeYml0dGVyfF5kaXNsaWtlfF5mZXJvY2l8XmZ1cnl8XmZ1cml8XmhhdGV8Xmhvc3RpbHxebG9hdGh8Xm91dHJhZ2V8XnJhZ2V8XnJhZ3xecmVzZW50fF5zY29ybnxec3BpdGV8XnZlbmdlfF53cmF0aHxedG9ybWVudHxeZmVhcnxeaG9ycnxeYWxhcm18XmZyaWdodHxeaHlzdGVyfF5tb3J0aWZpfF5wYW5pY3xec2hvY2t8XnRlcnJvcnxebmVydm91c3xeYW54aXxeYXBwcmVoZW58XmRpc3RyZXNzfF5kcmVhZHxedGVuc2V8XnVuZWFzaXxedW5lYXN5fF53b3JyfF5qb3l8XmNoZWVyfF5hbXVzZXxeYmxpc3N8XmRlbGlnaHR8XmVjc3RhfF5lbGF0aXxeZW5qb3l8XmV1cGhvcnxeZ2FpZXR5fF5nbGFkfF5nbGVlfF5oYXBwaXxeam9sbGl8XmpvbGx5fF5qb3ZpYWx8Xmp1YmlsfF5zYXRpc2Z8XmNvbnRlbnR8XnBsZWFzdXJ8XmVudGhyYWxsfF5yYXB0dXJ8XmVhZ2VyfF5ob3BlfF5vcHRpbWlzfF5wcmlkZXxecHJvdWR8XnRyaXVtcGh8XnJlbGllfF56ZXN0fF5lbnRodXNpYXN8XmV4Y2l0fF5leGhpbGFyYXxedGhyaWxsfF56ZWFsfF5sb3ZlfF5hZG9yfF5hZmZlY3xeYXR0cmFjfF5jYXJlfF5jYXJpfF5jb21wYXNzaW9ufF5mb25kfF5saWtlfF5saWtpbmd8XnNlbnRpbWVudHxedGVuZGVyfF5sb25nfF5hcm91c3xeZGVzaXJlfF5pbmZhdHVhdHxebHVzdHxecGFzc2lvbnxec2FkfF5kaXNhcHBvaW50fF5kaXNtYXl8XmRpc3BsZWFzdXJ8XmFsaWVufF5kZWZlYXR8XmRlamVjdHxeZW1iYXJyYXNzfF5ob21lc2lja3xeaHVtaWxpYXR8Xmluc2VjdXJ8Xmlzb2xhfF5pbnN1bHR8XmxvbmVsfF5uZWdsZWN0fF5yZWplY3R8XmRlcHJlc3N8XmRlc3BhaXJ8Xmdsb29tfF5nbHVtfF5ncmllfF5ob3BlbGVzc3xebWVsYW5jaG9saXxebWlzZXJ8XnNvcnJvd3xedW5oYXBwaXxed29lfF5zaGFtZXxeZ3VpbHR8XnJlZ3JldHxecmVtb3JzZXxec3VmZmVyfF5hZ29ufF5hbmd1aXNofF5odXJ0fF5waXR5fF5waXRpfF5zeW1wYXRofF5zdXJwcmlzZXxeYW1hemV8XmFzdG9uaXNoIikpLCBjb2xsYXBzZSA9ICcgJykKYGBg